package com.amos.knife4j.service;

import com.amos.knife4j.config.exception.BusinessException;
import com.github.pagehelper.PageInfo;

import java.io.Serializable;
import java.util.List;

/**
 * Service基类接口
 *
 * @param <T>
 * @param <ID>
 * @author wang_dgang
 * @since 2018-10-22 15:53:05
 */
public interface BaseService<T, ID extends Serializable> {
    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     *
     * @param record
     * @return
     * @throws BusinessException
     */
    int insert(T record) throws BusinessException;

    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     *
     * @param record
     * @return
     * @throws BusinessException
     */
    int insertSelective(T record) throws BusinessException;

    /**
     * 根据主键更新实体全部字段，null值会被更新
     *
     * @param record
     * @return
     * @throws BusinessException
     */
    //int updateByPrimaryKey(T record) throws BusinessException;

    /**
     * 根据主键更新属性不为null的值
     *
     * @param record
     * @return
     * @throws BusinessException
     */
    //int updateByPrimaryKeySelective(T record) throws BusinessException;

    /**
     * 根据主键字段进行删除，方法参数必须包含完整的主键属性
     *
     * @param id
     * @return
     * @throws BusinessException
     */
    int deleteByPrimaryKey(ID id) throws BusinessException;

    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     *
     * @param id
     * @return
     * @throws BusinessException
     */
    T selectByPrimaryKey(ID id) throws BusinessException;

    /**
     * 查询唯一
     *
     * @author meng_lbo
     * @date 2020/2/13  9:41
     */
    T selectOne(T record) throws BusinessException;

    /**
     * 查询全部结果
     *
     * @return
     * @throws BusinessException
     */
    List<T> selectAll() throws BusinessException;

    /**
     * 根据实体中的属性值进行查询，查询条件使用等号
     *
     * @param record
     * @return
     * @throws BusinessException
     */
    List<T> select(T record) throws BusinessException;

    /**
     * 根据实体中的属性查询总数，查询条件使用等号
     *
     * @param record
     * @return
     * @throws BusinessException
     */
    int selectCount(T record) throws BusinessException;

    /**
     * 相等查询和模糊查询, equels和like相同的类
     *
     * @param equels 相等条件，优先级高于like，不能为空
     * @param like   模糊条件，优先级低于equels，不能为空
     * @return
     * @throws BusinessException
     */
    List<T> select(T equels, T like) throws BusinessException;

    /**
     * 模糊查询
     *
     * @param like 模糊条件，不能为空
     * @return
     * @throws BusinessException
     */
    List<T> selectLike(T like) throws BusinessException;

    /**
     * 分页查询
     *
     * @param pageSize 每页条数
     * @param pageNum  页码
     * @param orderBy  排序字段
     * @param isDesc   是否降序
     * @return
     * @throws BusinessException
     */
    PageInfo<T> selectByPage(int pageSize, int pageNum, String orderBy, boolean isDesc) throws BusinessException;

    /**
     * 分页查询 (相等查询和模糊查询), equels和like相同的类
     *
     * @param equels   相等条件，优先级高于like，不能为空
     * @param like     模糊条件，优先级低于equels，不能为空
     * @param pageSize 每页条数
     * @param pageNum  页码
     * @param orderBy  排序字段
     * @param isDesc   是否降序
     * @return
     * @throws BusinessException
     */
    PageInfo<T> selectByPage(T equels, T like, int pageSize, int pageNum, String orderBy, boolean isDesc) throws BusinessException;

    /**
     * 分页查询 (相等查询)
     *
     * @param equels   相等条件，不能为空
     * @param pageSize 每页条数
     * @param pageNum  页码
     * @param orderBy  排序字段
     * @param isDesc   是否降序
     * @return
     * @throws BusinessException
     */
    PageInfo<T> selectByPage(T equels, int pageSize, int pageNum, String orderBy, boolean isDesc) throws BusinessException;

    /**
     * 分页查询 (模糊查询)
     *
     * @param pageSize 每页条数
     * @param pageNum  页码
     * @param like     模糊条件，不能为空
     * @param orderBy  排序字段
     * @param isDesc   是否降序
     * @return
     * @throws BusinessException
     */
    PageInfo<T> selectByPage(int pageSize, int pageNum, T like, String orderBy, boolean isDesc) throws BusinessException;

    int delete(T record) throws BusinessException;

}
